type MessageType = "image" | "audio" | string; // 微信消息类型
// type xtype = string;

let obj = { username: "wangwu", age: 123 };

type Message = {
  id: number;
  type: MessageType;
  sendmessage: string;
};

let msgobj: Message = {
  id: 23,
  type: "文本",
  sendmessage: "优化了多级联动的纯文本模式下内容显示错误的问题；",
};

// 对象数据类型
// let messages: Array<Message> = [
let messages: Message[] = [
  { id: 1, type: "image", sendmessage: "你好啊，今晚咋们一起去三里屯吧" },
  { id: 2, type: "audio", sendmessage: "你好！张无忌" },
  { id: 3, type: "audio", sendmessage: "朝辞白帝彩云间，千里江陵一日还" },
  { id: 4, type: "image", sendmessage: "刘老根苦练舞台绝技" },
  { id: 5, type: "image", sendmessage: "今晚王牌对王牌节目咋样" },
];

function getMessage(id: number): Message; // 重载签名，可以有多个
function getMessage(msgType: MessageType): Message[]; // 重载签名
function getMessage(msgType: MessageType, readRecordCount: number): Message[]; // 重载签名
// 实现函数签名，只有实现签名才有函数体，实现签名只有一个
// function getMessage(playload_frompage: any,readRecordCount: number = 1) { // 函数如果没有提供返回值类型它就会根据你返回实际的的返回值类型来推导函数最终要返回的类型
// function getMessage(playload_frompage: any,readRecordCount: number = 1): any { // 返回值 : any 一般呢也不建议大家这样去做，因为没有必要
function getMessage(
  playload_frompage: any,
  readRecordCount: number = 1 // 设置一个默认值防止第一个重载函数报错
): Message | undefined | Array<Message> {
  // 使用了联合类型来约束我们当前这个方法一个参数
  if (typeof playload_frompage === "number") {
    return messages.find((msg: Message) => {
      return playload_frompage === msg.id;
    });
  } else {
    return messages
      .filter((msg) => {
        return playload_frompage === msg.type;
      })
      .splice(0, readRecordCount);
  }
}

// 默认值
// function go(value: number, readRecordCount: number=2){}

let msges = getMessage(3);
console.log(msges.sendmessage); // 通过函数重载这里的`sendmessage`就可以点出来了，之前没有函数重载时我们还需要通过类型转换才行

console.log("---------------------------");

let msges1 = getMessage("image");
msges1.forEach((msg) => {
  console.log(msg.sendmessage);
});
console.log("---------------------------");
let msges2 = getMessage("image", 2);
msges2.forEach((msg) => {
  console.log(msg.sendmessage);
});

// unknown 只能作为其它类型的父类，不能作为其它类型的子类
// let z:unknown = 3;
// let k:number = z; // 这里不能把 unknown 类型的值赋值给 number 类型

// any 即可以用来接纳任何一种数据类型作为它的子类
// let z: any = 3;
// let k: number = z;

export {};
